# Пораждающий шаблон проектирования ("Строитель")
# Предоставляет способ создания составного объекта
# Отделяет конструирование сложного объекта от его представлени так что в результате одного процесса коструирования могут получаться развные объекты

import abc


class Phone():
    def __init__(self):
        self.data: str = ''

    def about_phone(self):
        return self.data

    def append_data(self, string: str):
        self.data += string


class IDeveloper(metaclass=abc.ABCMeta):
    def create_display(self):
        pass

    def create_box(self):
        pass

    def system_install(self):
        pass

    def get_phone(self) -> Phone:
        pass


class AndroidDeveloper(IDeveloper):
    def __init__(self):
        self.__phone = Phone()

    def create_display(self):
        self.__phone.append_data("Произведён дисплей Samsung; ")

    def create_box(self):
        self.__phone.append_data("Прозведён корпус Samsung; ")

    def system_install(self):
        self.__phone.append_data("Установлена система Android; ")

    def get_phone(self) -> Phone:
        return self.__phone


class IphoneDeveloper(IDeveloper):
    def __init__(self):
        self.__phone = Phone()

    def create_display(self):
        self.__phone.append_data("Произведён дисплей Iphone; ")

    def create_box(self):
        self.__phone.append_data("Прозведён корпус Iphone; ")

    def system_install(self):
        self.__phone.append_data("Установлена система Ios; ")

    def get_phone(self) -> Phone:
        return self.__phone


class Director:
    def __init__(self, developer: IDeveloper):
        self.__developer = developer

    def set_developer(self, developer: IDeveloper):
        self.__developer = developer

    def mount_only_phone(self) -> Phone:
        self.__developer.create_box()
        self.__developer.create_display()
        return self.__developer.get_phone()

    def mount_full_phone(self) -> Phone:
        self.__developer.create_box()
        self.__developer.create_display()
        self.__developer.system_install()
        return self.__developer.get_phone()


if __name__ == "__main__":
    android_developer: IDeveloper = AndroidDeveloper()
    iphone_developer: IDeveloper = IphoneDeveloper()

    director = Director(android_developer)
    samsung: Phone = director.mount_full_phone()
    print(samsung.about_phone())

    director.set_developer(iphone_developer)
    iphone: Phone = director.mount_full_phone()
    print(iphone.about_phone())

    none: Phone = director.mount_only_phone()
    print(none.about_phone())

# Прозведён корпус Samsung; Произведён дисплей Samsung; Установлена система Android;
# Прозведён корпус Iphone; Произведён дисплей Iphone; Установлена система Ios;
# Прозведён корпус Iphone; Произведён дисплей Iphone; Установлена система Ios; Прозведён корпус Iphone; Произведён дисплей Iphone;
